import cv2
import mediapipe as mp
import time
 
# 导入人脸识别模块
mpFace = mp.solutions.face_detection
# 导入绘图模块
mpDraw = mp.solutions.drawing_utils
# 自定义人脸识别方法，最小的人脸检测置信度0.5
faceDetection = mpFace.FaceDetection(min_detection_confidence=0.5)
 
#（1）导入视频
cap = cv2.VideoCapture(0)
 
pTime = 0  # 记录每帧图像处理的起始时间
 
#（2）处理每一帧图像
while True:
    
    # 每次取出一帧图像，返回是否读取成功(True/False)，以及读取的图像数据
    success, img = cap.read()
    
    # 将opencv导入的BGR图像转为RGB图像
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    # 将每一帧图像传给人脸识别模块
    results = faceDetection.process(imgRGB)
    
    # 如果检测不到人脸那就返回None
    if results.detections:
        
        # 返回人脸关键点索引index，和关键点的坐标信息
        for index, detection in enumerate(results.detections):
            
            # 遍历每一帧图像并打印结果
            print(index, detection)  
            # 每帧图像返回一次是人脸的几率，以及识别框的xywh，后续返回关键点的xy坐标
            # print(detection.score)  # 是人脸的的可能性
            # print(detection.location_data.relative_bounding_box)  # 识别框的xywh
             
            # 绘制关键点信息及边界框
            mpDraw.draw_detection(img, detection)
    
    # 记录每帧图像处理所花的时间
    cTime = time.time()
    fps = 1/(cTime-pTime)  #计算fps值
    pTime = cTime  # 更新每张图像处理的初始时间
    
    # 把fps值显示在图像上,img画板;fps变成字符串;显示的位置;设置字体;字体大小;字体颜色;线条粗细
    cv2.putText(img, f'FPS: {str(int(fps))}', (10,50), cv2.FONT_HERSHEY_PLAIN, 3, (0,255,0), 3) 
    
    # 显示图像，输入窗口名及图像数据
    cv2.imshow('image', img)    
    if cv2.waitKey(30) == ord("q"):
            cv2.destroyAllWindows()
            break
 
# 释放视频资源
cap.release()